package com.example.disk.service;

import com.example.disk.domain.FileDTO;
import com.example.disk.domain.FileVO;
import com.example.disk.domain.entity.File;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.multipart.MultipartFile;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author lpc
 * @since 2020-07-15
 */
public interface FileService extends IService<File> {

    /**
     * 获取指定目录下的文件
     * @param username 用户名
     * @param path 路径
     * @return 包括文件夹和文件
     */
    List<FileVO> getFileList(String username, String path) throws IOException;

    /**
     * 根据文件类型获取用户文件列表
     * @param username
     * @param type 1图片 2文档 3视频 4音乐 TODO 暂时只有这四种类型
     * @return
     */
    List<FileVO> getFileListByType(String username, int type) throws IOException;

    /**
     * 创建文件夹
     * @param username
     * @param path 在该路径下创建文件夹
     * @param dirName 要创建文件夹的名称
     * @return 创建成功true,失败false
     */
    boolean createDir(String username, String path, String dirName);


    /**
     * 保存上传的文件
     * @param username
     * @param path 保存文件的路径
     * @param multipartFile 文件类型
     * @param fileName 文件名（带扩展名）
     * @return
     */
    boolean saveFile(String username, String path, MultipartFile multipartFile, String fileName) throws IOException;

    /**
     * 删除指定文件
     * @param username
     * @param path
     * @param filename 没有扩展名
     * @param extend
     * @return
     */
    boolean deleteFile(String username, String path, String filename, String extend);

    /**
     * 删除指定文件夹及其所包含的文件 逻辑删除，不要从obs中删除
     * @param username
     * @param path
     * @param dirName
     * @return
     */
    boolean deleteDir(String username, String path, String dirName);

    /**
     * 重命名文件
     * @param username
     * @param path
     * @param filename 文件名【不包含扩展名】
     * @param extend 扩展名
     * @param newName
     * @return
     */
    boolean renameFile(String username, String path, String filename, String extend, String newName) throws IOException;

    /**
     * 重命名文件夹
     * @param username
     * @param path
     * @param dirName
     * @param newName
     * @return
     */
    boolean renameDir(String username, String path, String dirName, String newName) throws IOException;

    /**
     * 移动文件到指定目录
     * @param username
     * @param path
     * @param filename 不包含扩展名
     * @param extend
     * @param aimId
     * @return
     */
    boolean moveFile(String username, String path, String filename, String extend, int aimId) throws IOException;

    /**
     * 复制文件到指定目录
     * @param username
     * @param path
     * @param filename 不包含扩展名
     * @param extend
     * @param aimPath
     * @return
     */
    boolean copyFile(String username, String path, String filename, String extend, String aimPath) throws IOException;

    /**
     * 获取文件树
     * @param username
     * @return TODO 设计一种数据结构表示文件树
     */
    Object getFileTree(String username);

    /**
     * 获取文件夹树结构，用于移动文件
     * @param username
     * @return TODO
     */
    Object getDirTree(String username);

    /**
     * 获取用户已经使用的存储空间
     * @param userId
     * @return
     */
    Integer getStorage(int userId);

    /**
     * 批量删除文件
     * @param username
     * @param files
     * @return
     */
    boolean batchDeleteFile(String username, FileDTO[] files);


    /**
     * 批量删除文件
     * @param username
     * @param user_id
     * @return
     */
    void createRoot(String username, int user_id);

    //根据文件名进行模糊搜索
    List<FileVO> searchByName(String username,int user_id,String file_name) throws IOException;


    InputStream getInputStream(String username, String path, String filename) throws IOException;

    //清理文件
    boolean clearFile(String username,String filename,String extension,String path);

    //还原文件
    boolean restoreFile(String username,String filename,String extension,String path) throws IOException;

    //选出已经删除但是没有清理的文件
    List<FileVO> getDeleteFile(String username) throws IOException;


    File getFileById(int id);
}
